package com.beauty.product.service;

import com.beauty.product.document.ProductDocument;
import com.beauty.product.dto.PageResponse;
import com.beauty.product.dto.ProductDto;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 商品Elasticsearch服务接口
 * <p>
 * 定义了商品与Elasticsearch搜索引擎交互的所有操作，包括商品索引的创建、查询、更新、删除等功能，
 * 以及提供全文搜索、高级搜索和数据同步机制。该服务是商品全文检索功能的核心组件。
 * </p>
 * 
 * @author beauty-dev
 * @version 1.0
 */
public interface ProductElasticsearchService {

    /**
     * 将产品保存到Elasticsearch
     * <p>
     * 创建或更新一个产品文档到Elasticsearch索引中
     * </p>
     * 
     * @param productDocument 产品文档对象
     * @return 返回保存成功的产品文档
     */
    ProductDocument save(ProductDocument productDocument);

    /**
     * 批量保存产品到Elasticsearch
     * <p>
     * 一次性创建或更新多个产品文档到Elasticsearch索引中，提高批量操作效率
     * </p>
     * 
     * @param productDocuments 产品文档对象列表
     * @return 返回保存成功的产品文档集合
     */
    Iterable<ProductDocument> saveAll(List<ProductDocument> productDocuments);

    /**
     * 根据ID从Elasticsearch获取产品
     * <p>
     * 从Elasticsearch索引中检索特定ID的产品文档
     * </p>
     * 
     * @param id 产品ID
     * @return 返回指定ID的产品文档
     */
    ProductDocument findById(String id);

    /**
     * 根据关键词搜索产品
     * <p>
     * 在Elasticsearch中执行全文搜索，对产品名称、描述、品牌等字段进行模糊匹配
     * </p>
     * 
     * @param keyword 搜索关键词
     * @param pageable 分页参数
     * @return 返回搜索结果的分页数据
     */
    PageResponse<ProductDto> search(String keyword, Pageable pageable);

    /**
     * 高级搜索产品
     * <p>
     * 在Elasticsearch中执行复杂条件的高级搜索，支持多条件组合筛选
     * </p>
     * 
     * @param name 产品名称（可选）
     * @param brand 产品品牌（可选）
     * @param description 产品描述（可选）
     * @param minPrice 最低价格（可选）
     * @param maxPrice 最高价格（可选）
     * @param categoryId 分类ID（可选）
     * @param isPublished 是否已发布（可选）
     * @param isRecommended 是否推荐（可选）
     * @param isNew 是否新品（可选）
     * @param isHot 是否热销（可选）
     * @param pageable 分页参数
     * @return 返回搜索结果的分页数据
     */
    PageResponse<ProductDto> advancedSearch(String name, String brand, String description,
                                           BigDecimal minPrice, BigDecimal maxPrice,
                                           Long categoryId, Boolean isPublished,
                                           Boolean isRecommended, Boolean isNew, Boolean isHot,
                                           Pageable pageable);

    /**
     * 根据ID删除Elasticsearch中的产品
     * <p>
     * 从Elasticsearch索引中移除特定ID的产品文档
     * </p>
     * 
     * @param id 产品ID
     */
    void deleteById(String id);

    /**
     * 根据MySQL中的产品同步到Elasticsearch
     * <p>
     * 将数据库中特定ID的产品数据同步到Elasticsearch索引中，确保数据一致性
     * </p>
     * 
     * @param productId 产品ID
     */
    void syncProductFromDB(String productId);

    /**
     * 将数据库中所有产品同步到Elasticsearch
     * <p>
     * 批量同步所有产品数据，用于初始化索引或完全重建索引
     * </p>
     */
    void syncAllProductsFromDB();

    /**
     * 根据关键词搜索产品（已注释掉，可能已被search方法替代）
     * 
     * @param keyword 搜索关键词
     * @param pageable 分页参数
     * @return 返回搜索结果的分页数据
     */
//    PageResponse<ProductDto> searchByKeyword(String keyword, Pageable pageable);

}
